package com.zhengjiang.lambda;

/**
 * @author zhengjiang
 * @version 1.0.0
 * @description lambda表达式 & 匿名内部类
 * @date 2021/5/29
 **/
public class LambdaAndInner {
    private int age = 12;
    private static String name = "疯狂软件";
    public void test(){
        String book = "java讲义";
        Displayable dis1 = ()->{
            System.out.println("局部变量book:" + book);
            System.out.println("外部类实例变量age:"+age);
            System.out.println("外部类类变量name:" + name);
            //lambda表达式代码块中不能调用接口中的默认方法 add
        };

        dis1.display();
        System.out.println(dis1.add(1,2));

        Displayable dis2 = new Displayable() {
            @Override
            public void display() {
                System.out.println("局部变量book:" + book);
                System.out.println("外部类实例变量age:"+age);
                System.out.println("外部类类变量name:" + name);
                //匿名内部类调用接口中的默认方法 add
                System.out.println("匿名内部类调用default方法add:"+ add(1,2));
            }
        };

        dis2.display();
    }

    public static void main(String[] args) {
        LambdaAndInner lambda = new LambdaAndInner();
        lambda.test();
    }
}


//定义函数式接口
//只能声明一个抽象方法的接口,可以包含多个默认方法和类方法
@FunctionalInterface
interface Displayable {

    void display();

    default int add(int a,int b){
        return a + b;
    }
}
